/**
 * 线程间共享数据
 *
 * 1、共享数据带来的问题 
 *      条件竞争
 * 2、使用互斥量保护数据  
 *      精心组织代码来保护正确的数据
 *      在接口内部避免条件竞争
 *      互斥量自身有问题，会造成死锁
 *      对数据保护的太多（太少）
 * 3、数据保护的替代方案
 * 
 * std::lock_guard
 * std::mutex
 */

#include <list>
#include <mutex>
#include <algorithm>

std::list<int> some_list;
std::mutex some_mutex;  //互斥量 lock() unlock()

void add_to_list(int new_value)
{
    std::lock_guard<std::mutex> guard(some_mutex);  // std::lock_guard 构造是提供已锁互斥量，析构时进行解锁
    some_list.push_back(new_value);
}
bool list_contains(int value_to_find)
{
    std::lock_guard<std::mutex> guard(some_mutex);
    return std::find(some_list.begin(), some_list.end(), value_to_find) != some_list.end();
}

#include <iostream>

int main()
{
    add_to_list(42);
    std::cout << "contains(1)=" << list_contains(1) << ", contains(42)=" << list_contains(42) << std::endl;
}
